package com.yingpai.fitness.dvp_2_0.common.util;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 *
 * @author GuoBin
 *考虑到Json数据的不同，那么解析Json的时候所用的类也可能不同，比如这里用的是Person，如果解析其他数据可能用的又是Dog、Cat...
 *所以考虑将用GSON解析的步骤封装，
 *并提供泛型参数，
 *封装的GSON解析工具类，提供泛型参数
 */
public class GsonUtil {

	private static Gson gson = null;
	static {
		if (gson == null) {
			gson = new Gson();
		}
	}

	private GsonUtil() {


	}
	/**
	 * 将对象转化为json字符串
	 * @param object
	 * @param <T>
	 * @return
	 */
	public static  <T> String serialize(T object)
	{
		return gson.toJson(object);
	}



	/**
	 * 将json对象   转换为  实体对象
	 * @param json
	 * @param clz
	 * @param <T>
	 * @return
	 * @throws JsonSyntaxException
	 */
	public static <T> T deserialize(JsonObject json, Class<T> clz) throws JsonSyntaxException {
		return gson.fromJson(json, clz);
	}

	/**
	 * 将json字符串转换为对象
	 * @param json
	 * @param type
	 * @param <T>
	 * @return
	 */
	public static <T> T deserialize(String json, Type type) throws JsonSyntaxException {
		return gson.fromJson(json, type);
	}
	/**
	 * 转成map的  当后台所给的数据格式美哟统一的格式  采用
	 *
	 * @param json
	 * @return
	 */
	public static <T> Map<String, T> ToMaps(String json) {
		Map<String, T> map = null;
		if (gson != null) {
			map = gson.fromJson(json, new TypeToken<Map<String, T>>() {
			}.getType());
		}
		return map;
	}



	// 将Json数据解析成相应的映射对象    支持实体类

	/**
	 * string to class
	 * @param jsonData
	 * @param type
	 * @param <T>
	 * @return
	 */
	public static <T> T jsonStringToClassWithGson(String jsonData, Class<T> type){

		T t = null;
		if (gson != null) {
			try {
				t = gson.fromJson(jsonData, type);
			} catch (JsonSyntaxException e) {
				e.printStackTrace();
			}
		}

		return t;

	}



	/**
	 * class 转成  json字符串
	 *
	 * @param object
	 * @return
	 */
	public static String parseObjectToJsonString(Object object) {
		String json = null;
		if (gson != null) {

			json = gson.toJson(object);
		}
		return json;
	}


	/**
	 *   json string 转成list<class></>
	 * 泛型在编译期类型被擦除导致报错
	 * @param gsonString
	 * @param cls
	 * @return
	 */
	public static <T> List<T> GsonToList(String gsonString, Class<T> cls) {
		List<T> list = null;
		if (gson != null) {
			list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
			}.getType());
		}
		return list;
	}

	/**
	 * json  string 转成list
	 * 解决泛型问题
	 * @param json
	 * @param cls
	 * @param <T>
	 * @return
	 */
	public  static <T> List<T> jsonToList(String json, Class<T> cls) {

		List<T> list = new ArrayList<T>();
		JsonArray array = new JsonParser().parse(json).getAsJsonArray();
		for(final JsonElement elem : array){
			list.add(gson.fromJson(elem, cls));
		}
		return list;
	}


	/**
	 * json string 转成list中有map的
	 *
	 * @param gsonString
	 * @return
	 */
	public static <T> List<Map<String, T>> GsonToListMaps(String gsonString) {
		List<Map<String, T>> list = null;
		if (gson != null) {
			list = gson.fromJson(gsonString,
					new TypeToken<List<Map<String, T>>>() {
					}.getType());
		}
		return list;
	}







}
